// 你有一个日志数组 logs。每条日志都是以空格分隔的字串。

// 对于每条日志，其第一个字为字母数字标识符。然后，要么：

// 标识符后面的每个字将仅由小写字母组成，或；
// 标识符后面的每个字将仅由数字组成。
// 我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。

// 将日志重新排序，使得所有字母日志都排在数字日志之前。字母日志按内容字母顺序排序，忽略标识符；在内容相同时，按标识符排序。数字日志应该按原来的顺序排列。

// 返回日志的最终顺序。

//  

// 示例 ：

// 输入：["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
// 输出：["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
//  

// 提示：

// 0 <= logs.length <= 100
// 3 <= logs[i].length <= 100
// logs[i] 保证有一个标识符，并且标识符后面有一个字。

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

class Solution {
public:
    vector<string> reorderLogFiles(vector<string>& logs) {
        vector<string> alpha_logs{};
        vector<string> digit_logs{};
        // 字数分离
        for (const auto& log : logs) {
            int n = log.size();
            if (isalpha(log[n-1])) alpha_logs.push_back(log);
            if (isdigit(log[n-1])) digit_logs.push_back(log);
        }
        sort(alpha_logs.begin(), alpha_logs.end(), cmp);
        // 字后加数
        for (auto digit_log : digit_logs) {
            alpha_logs.push_back(digit_log);
        }
        return alpha_logs;
    }

    static bool cmp(string a, string b) {
        int i{0};
        int j{0};
        int m{a.size()};
        int n{b.size()};
        while (a[i] != ' ' && i < m) ++i;
        while (b[j] != ' ' && j < n) ++j;
        string atmp = a.substr(i); // 除了第一个标识符之后的所有
        string btmp = b.substr(j);
        if (atmp == btmp) return a < b;
        return atmp < btmp;
    }
};

class Solution {
public:
    vector<string> reorderLogFiles(vector<string>& logs) {
        stable_sort(logs.begin(), logs.end(), [] (const string& log1, const string& log2) {
            int pos1 = log1.find_first_of(" ");
            int pos2 = log2.find_first_of(" ");
            bool isDigit1 = isdigit(log1[pos1 + 1]);
            bool isDigit2 = isdigit(log2[pos2 + 1]);
            // 两个数字日志就不用排序了
            if (isDigit1 && isDigit2) {
                return false;
            }
            // 两个字母日志需要排序
            if (!isDigit1 && !isDigit2) {
                string s1 = log1.substr(pos1);
                string s2 = log2.substr(pos2);
                if (s1 != s2) {
                    return s1 < s2;
                }
                return log1 < log2;
            }
            return isDigit1 ? false : true;
        });
        return logs;
    }
};
